001 /** 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: Jan 16, 2003 005 * Time: 8:39:52 PM 006 */ 007 008 package EVolve.util.predefinedutils; 009 010 import EVolve.Scene; 011 import EVolve.exceptions.*; 012 import EVolve.visualization.*; 013 import EVolve.visualization.Dimension; 014 import javax.swing.*; 015 import java.util.*; 016 import java.io.*; 017 import java.awt.*; 018 import java.awt.event.*; 019 020 public class VisualizationSerializer { 021 private static VisualizationSerializer instance = null; 022 private JDialog dialog; 023 private JCheckBox checkSelection; 024 private JTextField textConfigureName, textSelectionName; 025 private JTextField textConfigureFile, textSelectionFile; 026 private JButton buttonConfigure, buttonSelection; 027 private JButton buttonSave, buttonCancel; 028 private FileWriter fileConfigure, fileSelection; 029 030 private VisualizationSerializer() { 031 dialog = null; 032 } 033 034 public static VisualizationSerializer v() { 035 if (instance == null) instance = new VisualizationSerializer(); 036 return instance; 037 } 038 039 public void readSetting() { 040 041 } 042 043 public void showSavingDialog() { 044 if (dialog == null) { 045 createDialog(); 046 } else { 047 if (Scene.getFilter().getSelection().length == 0) { 048 checkSelection.setSelected(false); 049 textSelectionName.setEnabled(false); 050 textSelectionFile.setEnabled(false); 051 buttonSelection.setEnabled(false); 052 } 053 dialog.setVisible(true); 054 } 055 } 056 057 private void createDialog() { 058 Box boxMain = new Box(BoxLayout.Y_AXIS); 059 060 dialog = new JDialog(Scene.getFrame(), "Setting Saving...", true); 061 dialog.setBounds(new Rectangle(500,250)); 062 063 064 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), 065 "Save configuration and selections")); 066 dialog.getContentPane().add(boxMain,BorderLayout.CENTER); 067 068 //*********************************** 069 Box boxConfigureName = new Box(BoxLayout.X_AXIS); 070 boxConfigureName.add(new JLabel("Configuration name:")); 071 textConfigureName = new JTextField(12); 072 boxConfigureName.add(Box.createHorizontalStrut(25)); 073 boxConfigureName.add(textConfigureName); 074 075 Box boxConfig = new Box(BoxLayout.X_AXIS); 076 boxConfig.add(new JLabel("Choose configure file:")); 077 textConfigureFile = new JTextField(12); 078 boxConfig.add(Box.createHorizontalStrut(20)); 079 boxConfig.add(textConfigureFile,BorderLayout.CENTER); 080 buttonConfigure = new JButton("..."); 081 buttonConfigure.addActionListener(new ActionListener(){ 082 public void actionPerformed(ActionEvent e) { 083 JFileChooser fc = selectFile(); 084 if (fc == null) return; 085 textConfigureFile.setText(fc.getSelectedFile().getPath()); 086 } 087 }); 088 boxConfig.add(buttonConfigure,BorderLayout.EAST); 089 090 //***************************** 091 Box boxChk = new Box(BoxLayout.X_AXIS); 092 checkSelection = new JCheckBox("Saving Filters & colors also"); 093 checkSelection.setMnemonic(KeyEvent.VK_F); 094 checkSelection.addActionListener(new ActionListener() { 095 public void actionPerformed(ActionEvent e) { 096 boolean enable = checkSelection.isSelected(); 097 if (Scene.getFilter().getSelection().length == 0) { 098 Scene.showErrorMessage("No active selection exists!"); 099 checkSelection.setSelected(false); 100 } else { 101 buttonSelection.setEnabled(enable); 102 textSelectionFile.setEnabled(enable); 103 textSelectionName.setEnabled(enable); 104 } 105 } 106 }); 107 boxChk.add(checkSelection); 108 JLabel note = new JLabel("(If checked, the configuration file can ONLY be applied to " + 109 " the current data source.)"); 110 note.setFont(new Font("Dialog",Font.ITALIC|Font.BOLD,9)); 111 boxChk.add(note); 112 113 //*********************************** 114 Box boxSelectionName = new Box(BoxLayout.X_AXIS); 115 boxSelectionName.add(new JLabel("Selection name:")); 116 boxSelectionName.add(Box.createHorizontalStrut(25)); 117 textSelectionName = new JTextField(12); 118 boxSelectionName.add(textSelectionName); 119 120 Box boxSelection = new Box(BoxLayout.X_AXIS); 121 boxSelection.add(new JLabel("Choose selection file:")); 122 textSelectionFile = new JTextField(12); 123 boxSelection.add(Box.createHorizontalStrut(20)); 124 boxSelection.add(textSelectionFile,BorderLayout.CENTER); 125 buttonSelection = new JButton("..."); 126 buttonSelection.addActionListener(new ActionListener() { 127 public void actionPerformed(ActionEvent e) { 128 JFileChooser fc = selectFile(); 129 if (fc == null) return; 130 textSelectionFile.setText(fc.getSelectedFile().getPath()); 131 } 132 }); 133 boxSelection.add(buttonSelection,BorderLayout.EAST); 134 135 //*********************************** 136 Box boxSaveCancel = new Box(BoxLayout.X_AXIS); 137 buttonSave = new JButton("Save"); 138 buttonSave.addActionListener(new ActionListener() { 139 public void actionPerformed(ActionEvent e) { 140 if (!validate()) return; 141 dialogSave(); 142 } 143 }); 144 145 buttonCancel = new JButton("Cancel"); 146 buttonCancel.addActionListener(new ActionListener() { 147 public void actionPerformed(ActionEvent e) { 148 dialog.setVisible(false); 149 } 150 }); 151 boxMain.add(Box.createHorizontalStrut(40)); 152 boxSaveCancel.add(buttonSave); 153 boxSaveCancel.add(Box.createHorizontalStrut(25)); 154 boxSaveCancel.add(buttonCancel); 155 156 boxMain.add(boxConfigureName); 157 boxMain.add(Box.createVerticalStrut(5)); 158 boxMain.add(boxConfig); 159 boxMain.add(Box.createVerticalStrut(15)); 160 boxMain.add(boxChk); 161 boxMain.add(Box.createVerticalStrut(8)); 162 boxMain.add(boxSelectionName); 163 boxMain.add(Box.createVerticalStrut(5)); 164 boxMain.add(boxSelection); 165 boxMain.add(Box.createVerticalStrut(25)); 166 boxMain.add(boxSaveCancel); 167 168 textSelectionName.setEnabled(false); 169 textSelectionFile.setEnabled(false); 170 buttonSelection.setEnabled(false); 171 dialog.getContentPane().add(boxMain); 172 dialog.setResizable(false); 173 dialog.pack(); 174 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight()); 175 } 176 177 private JFileChooser selectFile() { 178 JFileChooser fc = new JFileChooser(); 179 if (fc.showSaveDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) { 180 return fc; 181 } 182 return null; 183 } 184 185 private void dialogSave() { 186 saveConfiguration(); 187 if (checkSelection.isSelected()) 188 saveSelection(); 189 dialog.setVisible(false); 190 } 191 192 private boolean validate() { 193 if ((textConfigureFile.getText() == null) || (textConfigureName.getText() == null)) { 194 Scene.showErrorMessage("User must name the configuration to be saved and choose a file!"); 195 return false; 196 } 197 198 if (checkSelection.isSelected() && 199 ((textSelectionFile.getText() == null) || (textSelectionName.getText() == null))) { 200 Scene.showErrorMessage("User must name the filters to be saved and select a file to save them!"); 201 return false; 202 } 203 204 return true; 205 } 206 207 private void saveConfiguration() { 208 ArrayList vizList = Scene.getVisualizationManager().getVisualizationList(); 209 if (vizList.size() == 0) { 210 Scene.showErrorMessage("Nothing to be saved!"); 211 return; 212 } 213 214 try { 215 fileConfigure = new FileWriter(textConfigureFile.getText().trim(),false); 216 } catch (IOException ioe) { 217 Scene.showErrorMessage("Can not access file \""+textConfigureFile.getText()+"\""); 218 return; 219 } 220 221 try { 222 String configureName = textConfigureName.getText().trim(); 223 fileConfigure.write(Scene.VERSION+"\n"); 224 fileConfigure.write("File Type:Configuration\n"); 225 fileConfigure.write("Store:;\n"); 226 fileConfigure.write(configureName+"\n"); 227 fileConfigure.write("Datasource:"+(checkSelection.isSelected() ? Scene.getCurrentDataFilename() : ";")+"\n"); 228 fileConfigure.write("Selection:"+(checkSelection.isSelected() ? textSelectionFile.getText() : ";")+"\n"); 229 for (int i = 0; i<vizList.size(); i++) { 230 Visualization visual = (Visualization)vizList.get(i); 231 HashMap config = visual.getCurrentConfigure(); 232 fileConfigure.write(visual.getFactory().getFactoryName()+"\n"); 233 fileConfigure.write(visual.getSubjectDefinition().getName()+"\n"); 234 Dimension[] dim = (Dimension[])config.get("Dimension"); 235 for (int j=0;j<dim.length;j++) { 236 fileConfigure.write(dim[j].getDataFilter().getName()+"\n"); 237 } 238 for (int j=dim.length; j<3; j++) fileConfigure.write(";not using this dimension\n"); 239 if (config.get("Predictor") != null) 240 fileConfigure.write(((PredictorFactory)config.get("Predictor")).getName()+"\n"); 241 else 242 fileConfigure.write(";not using predictor\n"); 243 244 String intervalString = ""; 245 intervalString += config.get("Interval").toString(); 246 if (config.get("BeginCall")!=null) { 247 intervalString = intervalString + ";" + config.get("BeginCall").toString() + ","; 248 intervalString = intervalString + config.get("EndCall").toString(); 249 } 250 if (config.get("Match") != null) { 251 intervalString = "," + intervalString + config.get("Match").toString(); 252 } 253 fileConfigure.write(intervalString+"\n"); 254 255 fileConfigure.write(visual.getWindow().getTitle()+"\n"); 256 Rectangle rect = visual.getWindow().getBounds(); 257 fileConfigure.write(new Integer(rect.x).toString() + "\n"); 258 fileConfigure.write(new Integer(rect.y).toString() + "\n"); 259 fileConfigure.write(new Integer(rect.width).toString() + "\n"); 260 fileConfigure.write(new Integer(rect.height).toString() + "\n"); 261 fileConfigure.write((String)config.get("Options")+"\n"); 262 } 263 Scene.getUIManager().refreshMenu(textConfigureFile.getText(),configureName); 264 fileConfigure.flush(); 265 fileConfigure.close(); 266 } catch (IOException e) { 267 Scene.showErrorMessage("Error occurred when trying to save configuration!"); 268 } 269 270 } 271 272 private void saveSelection() { 273 try { 274 fileSelection = new FileWriter(textSelectionFile.getText().trim(),false); 275 } catch (IOException ioe) { 276 Scene.showErrorMessage("Can not access file \""+textSelectionFile.getText()+"\""); 277 return; 278 } 279 Scene.getFilter().saveSelection(fileSelection,textSelectionName.getText().trim()); 280 } 281 282 public void loadConfiguration() { 283 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastConfigDir()); 284 String configureName = null,filename = null; 285 286 if(fc.showOpenDialog(Scene.getFrame()) != JFileChooser.APPROVE_OPTION) return; 287 288 try { 289 filename = fc.getSelectedFile().getPath(); 290 Scene.getUIManager().setLastConfigDir(filename); 291 SerializerInfo info = getVizInfoFromDisk(filename); 292 configureName = info.name; 293 } catch (Exception e) { 294 Scene.showErrorMessage(e.getMessage()); 295 return; 296 } 297 Scene.getUIManager().refreshMenu(filename,configureName); 298 } 299 300 public void loadData(String dataFile) throws EVolveException{ 301 if (dataFile.charAt(0)!= ';') { 302 // autoload data source 303 if (!Scene.getCurrentDataFilename().equals(dataFile)) { 304 Scene.setDataFilename(dataFile); 305 Scene.autoLoadDataSource(); 306 Scene.setDataFilename(null); 307 } 308 //String selection = selFile.substring(selFile.indexOf(':')+1); 309 //RandomAccessFile file = new RandomAccessFile(selection,"r"); 310 //Scene.getFilter().loadSelection(file); 311 } 312 } 313 314 public void loadSelection(String selFile) throws EVolveException{ 315 try { 316 if (selFile.charAt(0)!= ';') { 317 RandomAccessFile file = new RandomAccessFile(selFile,"r"); 318 Scene.getFilter().loadSelection(file); 319 } 320 } catch (IOException e) { 321 Scene.showErrorMessage("IO exception occurred when trying to load selections and data source."); 322 } 323 } 324 325 public SerializerInfo getVizInfoFromDisk(String filename) throws EVolveException { 326 String nextLine; 327 int lineno = 0; 328 SerializerInfo info = null; 329 330 try { 331 info = new SerializerInfo(); 332 RandomAccessFile file = new RandomAccessFile(filename,"r"); 333 info.version = file.readLine(); // get version number 334 if (!info.version.equals(Scene.VERSION)) throw (new WrongVersionException(info.version)); 335 lineno++; 336 337 String fileType = file.readLine(); //get file type 338 fileType = fileType.substring(fileType.indexOf(':')+1); 339 if (fileType.charAt(0) != 'C') throw new FileTypeMismatchException("Configuration file", fileType+" file"); 340 341 info.resultPath = file.readLine(); // get path where viz result is to be saved 342 info.resultPath = info.resultPath.substring(info.resultPath.indexOf(':')+1); 343 lineno++; 344 info.name = file.readLine().trim(); // get viz setting name 345 lineno++; 346 info.dsource = file.readLine(); //get data source file name, if any 347 info.dsource = info.dsource.substring(info.dsource.indexOf(':')+1); 348 lineno++; 349 info.selectionFile = file.readLine(); //get selection file name, if any 350 info.selectionFile = info.selectionFile.substring(info.selectionFile.indexOf(':')+1); 351 lineno++; 352 if (info.dsource.indexOf(';') == -1 ) 353 info.specific = true;// a specific configuration 354 355 loadData(info.dsource); 356 loadSelection(info.selectionFile); 357 358 if (!Scene.getDataManager().isDataLoaded()) return info; 359 360 nextLine = file.readLine(); 361 lineno++; 362 while (nextLine != null) { 363 VizInfo vizInfo = new VizInfo(); 364 vizInfo.createFactory(nextLine.trim()); 365 lineno++; 366 vizInfo.createSubjectDefinition(file.readLine().trim()); 367 lineno++; 368 String[] dimensionDefs = new String[3]; 369 for (int i=0; i<dimensionDefs.length; i++) { 370 dimensionDefs[i] = file.readLine().trim(); 371 lineno++; 372 } 373 vizInfo.createDimension(dimensionDefs); 374 vizInfo.createPredictor(file.readLine().trim()); 375 lineno++; 376 vizInfo.createInterval(file.readLine().trim()); 377 lineno++; 378 vizInfo.createTitle(file.readLine().trim()); 379 lineno++; 380 vizInfo.createWindowPosition(file.readLine().trim(),file.readLine().trim(), 381 file.readLine().trim(),file.readLine().trim()); 382 lineno+=4; 383 vizInfo.createOptions(file.readLine().trim()); 384 lineno++; 385 386 info.vizInfoList.add(vizInfo); 387 nextLine = file.readLine(); 388 lineno++; 389 } 390 file.close(); 391 } catch (EVolveException e) { 392 String detail = e.getMessage(); 393 throw new ReadConfigureFileException(filename, String.valueOf(lineno),"Detailed Information:\n"+detail); 394 } catch (IOException e) { 395 Scene.showErrorMessage(e.getMessage()); 396 } catch (Exception e) { 397 throw new ReadConfigureFileException(filename, String.valueOf(lineno),"Detailed Information:N/A"); 398 } 399 return info; 400 } 401 }